home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Ham⁄GPS / SoftKiss.src.1.8 Folder / SoftKiss.src.1.8 / (unloved) / sfk_prep.c < prev    next >
Text File  |  1992-02-20  |  6KB  |  250 lines

  1. /*
  2.  * Routines to handle reading and writing the prep file
  3.  * and driver state
  4.  *
  5.  * by Aaron Wohl (aw0g+@andrew.cmu.edu) jul 1990
  6.  * Carnegie-Mellon University
  7.  * Special Projects
  8.  * Pittsburgh, PA 15213-3890
  9.  * (412)-268-5032
  10.  */
  11.  
  12. #ifdef NYI
  13.  
  14. #include "sfk_core.h"
  15. #include "sfk_prep.h"
  16. #include "string.h"
  17. #include "sfk_os_preserve.h"
  18.  
  19. /*
  20.  * create the resource fork of a the Prep file
  21.  */
  22. LDEF(void make_pref(void))
  23. {
  24.     SysEnvRec info;
  25.     short int current_directory;
  26.     Str255 vol_name;
  27.     int err;
  28.     SysEnvirons(1, &info);
  29.     GetVol(vol_name,¤t_directory);
  30.     SetVol("\p",info.sysVRefNum);
  31.     Create(PREP_NAME,0,'sFK0','Prep');
  32.     CreateResFile(PREP_NAME);
  33.     SetVol("\p",current_directory);
  34. }
  35.  
  36. /*
  37.  * return the resource fork
  38.  * return a system error code < 0 if can't open fork
  39.  */
  40. LDEF(int find_res_file(Str255 name,int permission))
  41. {
  42.     int result;
  43.     int ref_num;
  44.     SysEnvRec info;
  45.     short int current_directory;
  46.     Str255 vol_name;
  47.     int err;
  48.     SysEnvirons(1, &info);
  49.     GetVol(vol_name,¤t_directory);
  50. #ifdef RUBBISH
  51.     result=HOpenRF(info.sysVRefNum,0L,name,permission,&ref_num);
  52.     if(result>=0)
  53.         result=ref_num;
  54. #endif
  55.     result=OpenRFPerm(name,info.sysVRefNum,permission);
  56.     return result;
  57. }
  58.  
  59. /*
  60.  * get the state contained in the Prep file in the system folder
  61.  * returns < 0 on error (a system error code, or -1)
  62.  * returns 0 on success
  63.  */
  64. LDEF(long sfk_read_prep_internal(sfk_state_pt s))
  65. {
  66.   int old_res_file;
  67.   int err=0;
  68.   int prep_res;
  69.   sfk_state_pt **fhandle;
  70.   old_res_file=CurResFile();    /*remember so we can put current resource file back*/
  71.   prep_res=find_res_file(PREP_NAME,fsRdPerm); /*open the device driver resource file*/
  72.   if(prep_res < 0)        /*find the resource file?*/
  73.     return prep_res;
  74.   fhandle=(sfk_state_pt **)Get1Resource('Prep',PREP_RES_NUM);
  75.  if(fhandle==0)
  76.       err=ResError();
  77.   else
  78.       if(GetHandleSize(fhandle)!=sizeof(sfk_state))
  79.           err= -1;
  80.       else {
  81.           memcpy(s,*fhandle,sizeof(*s));
  82.           s->sfk_st&= ~MCS_unsaveable;        /*don't restore debug state, etc*/
  83.           if(s->sfk_st_maj_ver!=sfk_ST_maj_ver)
  84.             err= -1;
  85.           if(s->sfk_st_min_ver<sfk_ST_min_ver)
  86.             err= -1;
  87.           if(s->sfk_check_num!=sfk_check_num)
  88.             err= -1;
  89.       }
  90.   CloseResFile(prep_res);
  91.   UseResFile(old_res_file);    /*go back to the normal resource file*/
  92.   return err;
  93. }
  94.  
  95. int sfk_read_prep(sfk_state_pt s)
  96. {
  97.     return OSP_protected_call(OSP_same,sfk_read_prep_internal,s);
  98. }
  99.  
  100. LDEF(long sfk_write_prep_internal(sfk_state_pt s))
  101. {
  102.   int old_res_file;
  103.   int err=0;
  104.   int prep_res;
  105.   sfk_state_pt *fhandle;
  106.   old_res_file=CurResFile();    /*remember so we can put current resource file back*/
  107.   prep_res=find_res_file(PREP_NAME,fsRdWrPerm); /*open the device driver resource file*/
  108.   if(prep_res< 0) {
  109.     make_pref();
  110.     prep_res=find_res_file(PREP_NAME,fsRdWrPerm); /*open the device driver resource file*/
  111.   }
  112.   if(prep_res < 0)        /*find the resource file?*/
  113.     return prep_res;
  114.   UseResFile(prep_res);    /*may already be open, force to front*/
  115.   fhandle=(sfk_state_pt *)Get1Resource('Prep',PREP_RES_NUM);
  116.   if(fhandle==0) {
  117.     fhandle=(sfk_state_pt *)NewHandle(sizeof(*s));
  118.     if(fhandle!=0)
  119.       memcpy(*fhandle,s,sizeof(*s));
  120.     strcpy((*fhandle)->sfk_text_state,"SavedState");
  121.     AddResource(fhandle,'Prep',PREP_RES_NUM,"\p");
  122.     err=ResError();
  123.   } else {
  124.        if(GetHandleSize(fhandle)!=sizeof(sfk_state)) {
  125.            asm {
  126.                move.l fhandle,a0
  127.                move.w #sizeof(sfk_state),d0
  128.                _SetHandleSize
  129.                move.w d0,err
  130.            }
  131.        }
  132.        if(err==0) {
  133.          memcpy(*fhandle,s,sizeof(*s));
  134.          strcpy((*fhandle)->sfk_text_state,"SavedState");
  135.         ChangedResource(fhandle);
  136.          WriteResource(fhandle);
  137.      }
  138.   }
  139.   CloseResFile(prep_res);
  140.   UseResFile(old_res_file);    /*go back to the normal resource file*/
  141.   return err;
  142. }
  143.  
  144. int sfk_write_prep(sfk_state_pt s)
  145. {
  146.     return OSP_protected_call(OSP_same,sfk_write_prep_internal,s);
  147. }
  148.  
  149. LDEF(char *chooser_name(char *buf))
  150. {
  151.   unsigned char **handle;
  152.   int len;
  153.   handle=(unsigned char**)GetString(-16096);
  154.   len=GetHandleSize(handle);
  155.   if((handle==0)||(len<=1))
  156.    return "no-chooser-name";
  157.   if((**handle)>(len-1))
  158.    return "bad-chooser-name";
  159.   len=imin(sfk_uname_len-1,len);
  160.   len=imin(len,**handle);
  161.   if(len!=0)
  162.    memcpy(buf,(*handle)+1,len);
  163.   buf[len]=0;
  164.   return buf;
  165. }
  166.  
  167. int sfk_dont_like_prep(sfk_state_pt s)
  168. {
  169.   int result=((s->sfk_st_maj_ver!=sfk_ST_maj_ver)||
  170.      (s->sfk_st_min_ver!=sfk_ST_min_ver)||
  171.      (s->sfk_check_num!=sfk_check_num));
  172.   return result;
  173. }
  174.  
  175. void sfk_init_state(sfk_state_pt s)
  176. {
  177.   memset(s,0,sizeof(*s));
  178.   s->sfk_st_maj_ver=sfk_ST_maj_ver;
  179.   s->sfk_st_min_ver=sfk_ST_min_ver;
  180.   s->sfk_check_num=sfk_check_num;
  181. }
  182.  
  183. void sfk_invent_state(sfk_state_pt s)
  184. {
  185.   char buf[256];
  186.   sfk_init_state(s);
  187.   s->sfk_remind_time=DEFAULT_REMIND_TIME;
  188.   s->sfk_sound_id=DEFAULT_SOUND_ID;
  189.   TURN_ON_FLAGS(*s,MCS_want_open|MCS_hearmm|MCS_nsound|MCS_nblink|MCS_npost);
  190.   strcpy(s->sfk_uname,chooser_name(buf));
  191.   strcpy(s->sfk_text_state,"Default configuration used");
  192. }
  193.  
  194. int sfk_get_drvr_state(int refnum,sfk_state_pt s)
  195. {
  196.   int err;
  197.   sfk_io_record ios;
  198.   INIT_CPB(ios,refnum,sfk_get_state);
  199.   ios.iostate.sfk_st_maj_ver=sfk_ST_maj_ver;
  200.   ios.iostate.sfk_st_min_ver=sfk_ST_min_ver;
  201.   err=PBControl(&ios,FALSE);
  202.   *s=ios.iostate;
  203.   return err;
  204. }
  205.  
  206. sound_res_state sfk_use_sound_res(void)
  207. {
  208.     sound_res_state sstate;
  209.     sstate.prev_res=CurResFile();
  210.       sstate.sound_res=find_res_file("\pMailCheck Sounds",fsRdPerm);
  211.       if(sstate.sound_res>0)
  212.         UseResFile(sstate.sound_res);
  213.       return sstate;
  214. }
  215.  
  216. void sfk_close_sound_res(sound_res_state sstate)
  217. {
  218.      if(sstate.sound_res>0)
  219.       CloseResFile(sstate.sound_res);
  220.     UseResFile(sstate.prev_res);
  221. }
  222.  
  223. /*
  224.  * set driver state where the sound has possibly changed
  225.  */
  226. int sfk_set_drvr_state_sound_yes(int refnum,sfk_state_pt s,int iokind)
  227. {
  228.   sound_res_state cur_res=sfk_use_sound_res();
  229.   int err=sfk_set_drvr_state_sound_no(refnum,s,iokind);
  230.   sfk_close_sound_res(cur_res);
  231.   return err;
  232. }
  233.  
  234. /*
  235.  * set driver state where the sound has not changed
  236.  */
  237. int sfk_set_drvr_state_sound_no(int refnum,sfk_state_pt s,int iokind)
  238. {
  239.   int err;
  240.   sfk_io_record ios;
  241.   ios.iostate=*s;
  242.   INIT_CPB(ios,refnum,iokind);
  243.   err=PBControl(&ios,FALSE);
  244.   *s=ios.iostate;
  245.   return err;
  246. }
  247.  
  248. #endif
  249.  
  250.